package br.com.jk.cotacao.lancamento;

import br.com.jk.cotacao.*;
import br.com.jk.util.DAOException;
import br.com.jk.util.DaoFactory;
import br.com.jk.util.RNException;
import br.com.jk.util.pesquisa.Pesquisa.Opcao;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author camilo
 */
public class CotacaoLancamentoRn {

  private CotacaoLancamentoDao dao;

  public CotacaoLancamentoRn() {
    this.dao = DaoFactory.criarCotacaoLancamentoDao();
  }

  public void salvar(CotacaoLancamento lanc) throws RNException {
    try {
      this.dao.salvar(lanc);
    } catch (DAOException ex) {
      throw new RNException("Erro ao tentar salvar o registro", ex);
    }
  }
  
  public Boolean validaQuantidade(CotacaoLancamento lanc) throws RNException{
    /**
       * Faz uma consulta no banco de dados que retorna uma lista com os lançamentos já efetuados para o produto; Logo
       * após é feita uma somatória da lista que irá retornar o total de quantidades já lançadas mais o valor fornecido
       * no JFrame
       *
       * Se o total retornado for maior ele lança uma Exception;
       */
      List<CotacaoLancamento> lancamentos = dao.listar(lanc.getProduto(), lanc.getCotacao(), lanc.getCotacaoItens());
      if (lancamentos == null) {
        lancamentos = new ArrayList<>();
      }
      Integer quantidadeTotal = lanc.getQuantidade();
      for (int i = 0; i < lancamentos.size(); i++) {
        quantidadeTotal += lancamentos.get(i).getQuantidade();
      }
      if (quantidadeTotal <= lanc.getCotacaoItens().getQuantidade()) {
        return true;
      } else {
        throw new RNException("A quantidade digitada ultrapassa o limite total da cotação para esse produto");
      }
  }

  public List<CotacaoLancamento> listar(Integer numLancamento) {
    return this.dao.listar(numLancamento);
  }

  public List<CotacaoLancamento> pesquisaPadrao(Cotacao cotacao, String property, String criterio, Opcao opcao) {
    return this.dao.pesquisaPadrao(cotacao, property, criterio, opcao);
  }

  public List<CotacaoLancamento> pesquisaPadrao(Cotacao cotacao, String property, int criterio, Opcao opcao) {
    return this.dao.pesquisaPadrao(cotacao, property, criterio, opcao);
  }

  public CotacaoLancamento carregar(int id) {
    return this.dao.carregar(id);
  }

  public void excluir(CotacaoLancamento forn) throws RNException {
    try {
      this.dao.excluir(forn);
    } catch (DAOException ex) {
      throw new RNException("Não foi possível excluir", ex);
    }
  }

  public Integer proximoNumLancamento() {
    Integer ultimo = this.dao.ultimoNumLancamento();
    ultimo++;
    return ultimo;
  }
}
